#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2024 - 2024 heihieyouheihei, Inc. All Rights Reserved 
#
# @Time    : 2024/8/24 15:25
# @Author  : Yuyun
# @File    : 深拷贝与浅拷贝.py
# @IDE     : PyCharm

"""
浅拷贝：只复制对象本身，不复制对象内部的子对象，原始对象和拷贝对象共享内部子对象的内存地址。

深拷贝：不仅复制对象本身，还递归地复制对象内部的子对象，原始对象和拷贝对象完全独立。
"""

import copy
#浅拷贝
#copy模块的copy()函数可以用来实现浅拷贝
def shallow_copy():
    original_list = [1, 2, [3, 4]]
    copied_list = copy.copy(original_list)

    print(original_list)  # [1, 2, [3, 4]]
    print(copied_list)  # [1, 2, [3, 4]]

    # 修改列表中的元素（非嵌套列表）
    copied_list[1] = 200
    print(original_list)  # [1, 2, [3, 4]]
    print(copied_list)  # [1, 200, [3, 4]]

    # 修改嵌套列表中的元素
    copied_list[2][0] = 300
    print(original_list)  # [1, 2, [300, 4]]
    print(copied_list)  # [1, 200, [300, 4]]

    #修改非嵌套列表的元素不会影响到原始列表，
    # 但修改嵌套列表的元素会影响到原始列表，
    # 因为嵌套列表是共享内存地址的

def deep_copy():
    original_list = [1, 2, [3, 4]]
    deep_copied_list = copy.deepcopy(original_list)

    print(original_list)  # [1, 2, [3, 4]]
    print(deep_copied_list)  # [1, 2, [3, 4]]

    # 修改非嵌套列表的元素
    deep_copied_list[1] = 200
    print(original_list)  # [1, 2, [3, 4]]
    print(deep_copied_list)  # [1, 200, [3, 4]]

    # 修改嵌套列表中的元素
    deep_copied_list[2][0] = 300
    print(original_list)  # [1, 2, [3, 4]]
    print(deep_copied_list)  # [1, 200, [300, 4]]

    #深拷贝创建了原始列表及其所有子对象的独立副本

"""
赋值运算符 = 在 Python 中用于将右侧对象的引用（或者说“内存地址”）绑定到左侧的变量名上。
这意味着，当使用 = 赋值时，你并没有在内存中创建新的对象副本，而只是创建了一个新的变量名来引用现有的对象。
"""
def equal_sign():
    a = [1, 2, 3]
    b = a  # 使用赋值运算符 =

    print(a is b)  # 输出 True，说明 a 和 b 引用的是同一个对象

    a.append(4)
    print(b)  # 输出 [1, 2, 3, 4]，因为 a 和 b 引用的是同一个列表对象